
//1658.将x减到0的最小操作数
class Solution {
    public:
        int minOperations(vector<int>& nums, int x) {
            //需要移除左右两边的元素---->移除中间部分的元素
            //将题型转化为移除中间部分的元素，方便滑动窗口的使用
            //左右两边元素之和是x，则中间元素之和是sum-x，找到中间最长区间
    
            //计算中间部分需要的和
            int sum=0,n=nums.size();
            for(auto e:nums) sum+=e;  
            int mid=sum-x;
            if(mid<0) return -1;  //当mid小于都等于0的时候是没有区间满足条件的需要特殊处理
            if(mid==0) return n;
            //使用滑动窗口
            int left=0,num=0,tmp=0;
            for(int right=0;right<n;right++)
            {
                tmp+=nums[right];
                while(tmp>mid)
                tmp-=nums[left++];
    
                if(tmp==mid) num=max(num,right-left+1);
            }
            return num==0?-1:n-num;
        }
    };